package com.bms.cfcmms.service;

import com.bms.cfcmms.core.util.Utils;
import com.bms.cfcmms.dao.ModuleDao;
import com.bms.cfcmms.dao.UpdatePackDao;
import com.bms.cfcmms.dao.authority.UserRoleDetailDao;
import com.bms.cfcmms.model.share.ApplicationInfo;
import com.bms.cfcmms.util.SpringUtils;
import com.bms.cfcmms.util.annotation.TableDefine;
import com.bms.cfcmms.dao.SystemInfoDao;
import com.bms.cfcmms.dao.UserDao;
import com.bms.cfcmms.model.share.RoleInfo;
import com.bms.cfcmms.model.system.SystemInfo;
import com.bms.cfcmms.model.system.UpdatePack;
import com.bms.cfcmms.model.system.module.Module;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import java.io.File;
import java.lang.reflect.Field;
import java.sql.Timestamp;
import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

/**
 * Created by carl on 2016/4/11.
 */
@Service
public class SystemService {

    private static final Logger log = LoggerFactory.getLogger(SystemService.class);
    @Resource
    private ModuleDao moduleDao;

    @Resource
    private SystemInfoDao systemInfoDao;
    @Resource
    private UpdatePackDao updatePackDao;
    @Resource
    private UserDao userDao;
    @Resource
    private MenuService menuService;
    @Resource
    private UserRoleDetailDao userRoleDetailDao;

    private static SystemInfo systeminfo = null;

    /**
     * 添加模块通过名称.
     * <p>
     * 通过名称来添加模块
     * </p>
     *
     * @param moduleName 模块名称
     * @return 成功失败
     */
    public String addModuleWithName(String moduleName, Class<?> moduleClass,
                                    TableDefine tableDefine) {
        // 生成 模块文件
        Module module = new Module();
        module.setModuleName(moduleName);

        Module modul = new Module();
        modul.setTableName("Module");
        List<Module> modules = moduleDao.queryForObject(module, modul);

        if (modules.isEmpty()) {
            module = new Module();
            // 设置分组信息，先根据groupid找，再根据group找，如果groupid没找到，
            // 那么用group的名字新建一个分组
            //            module.setm(get_ModuleGroup(tableDefine.groupId(), tableDefine.group
            // ()));
            module.setModuleId(Long.valueOf(tableDefine.id()));

            //如果模块的表定义中没有表名的定义，默认认为表明和当前模块的类名是相同的
            String tableName = Utils.zeroToNull(tableDefine.tableName());
            if ( Utils.zeroToNull(tableName) == null) {
                tableName = moduleName;
            }
            module.setTableName(tableName);
            module.setModuleName(moduleName);
            module.setTitle(tableDefine.title());

            module.setNameFields("undefined");
            module.setPrimaryKey(tableDefine.primaryKey());

            // 模块的权限的一些设置
            module.setIsEnable(tableDefine.isEnable());
            module.setHasBrowse(tableDefine.hasBrowse());
            module.setHasInsert(tableDefine.hasInsert());
            module.setHasEdit(tableDefine.hasEdit());
            module.setHasDelete(tableDefine.hasDelete());
            module.setHasChart(tableDefine.hasChart());

            module.setIsSystem(tableDefine.isSystem());
            module.setCanLimit(tableDefine.canLimit());

            module.setRequestMapping("undefined");
            module.setModuleEquals("");

            module.setRemark(Utils.zeroToNull(tableDefine.remark()));

            moduleDao.save(module, Module.TABLE_NAME);
        }
        return null;
    }

    /**
     * 查询系统信息.
     *
     * @return 系统信息对象
     */
    public SystemInfo findSysteminfo() {
        SystemInfo systemInfo = systemInfoDao.queryForObjectById(SystemInfo.THE_FIRST_RECORD);
        if (systemInfo == null) {
            log.error(SpringUtils.getMessage("record.notfind", "SystemInfo"));
        }
        return systemInfo;
    }

    /**
     * 将提交的文件信息存入数据库.
     *
     * @param file 待处理的文件
     * @return 存入数据库中记录的ID
     */
    public Integer handleUpdatePack(File file) {
        String content = Utils.readZipFile(file);

        String fileName = file.getName();
        UpdatePack updatePack = new UpdatePack();
        updatePack.setName(fileName);
        updatePack.setUploadTime(new Timestamp(System.currentTimeMillis()));

        updatePack.setPackageSize(file.length());
        updatePack.setIsUpdate(false);
        updatePack.setDescription(content);

        String[] names = fileName.split("_");
        String version = "";
        if (names.length == 2) {
            int index = names[1].lastIndexOf('.');
            version = names[1].substring(0, index);
        }
        updatePack.setVersion(version);
        return updatePackDao.save(updatePack, UpdatePack.TABLE_NAME);
    }

    private Integer refreshModuleFields(Class<?> beanClass, Module module, Integer maxId) {

        // 每一个数据库里没有的字段写入数据库
        int index = 0;
        Field[] fields = beanClass.getDeclaredFields();
        for (Field field : fields) {
            //TODO
        }
        return index;
    }

    public void saveLoginInfo(HttpServletRequest request) {
        log.debug("写入登录日志，用户名：");
    }

    public ApplicationInfo getApplicationInfo(HttpServletRequest request) {
        return null;
    }


    public synchronized RoleInfo getRoleInfo(HttpServletRequest request) {
        RoleInfo info = new RoleInfo();
        return info;
    }

    public synchronized SystemInfo getSysteminfo() {
        if (systeminfo == null){
            systeminfo = systemInfoDao.queryForObjectById(1);
        }
        return systeminfo;
    }
}
